package cn.edu.xjtu.carlWay.backTrack.palindromePartitioning;

import java.util.ArrayList;
import java.util.Deque;
import java.util.LinkedList;
import java.util.List;

/**
 * 131. 分割回文串
 * 给你一个字符串 s，请你将 s 分割成一些子串，使每个子串都是 回文串 。返回 s 所有可能的分割方案。
 * <p>
 * 回文串 是正着读和反着读都一样的字符串。
 * <p>
 * https://leetcode-cn.com/problems/palindrome-partitioning/
 */
public class Solution {
    List<List<String>> result = new ArrayList<>();
    Deque<String> deque = new LinkedList<>();

    public static void main(String[] args) {
        Solution solution = new Solution();
        System.out.println(solution.partition("aab"));
    }

    public List<List<String>> partition(String s) {
        backtrack(s, 0);
        return result;
    }

    private void backtrack(String s, int index) {
        if (index == s.length()) {
            result.add(new ArrayList<>(deque));
        } else {
            for (int i = index; i < s.length(); i++) {
                if (judge(s, index, i)) {
                    deque.addLast(s.substring(index, i + 1));
                    backtrack(s, i + 1);
                    deque.removeLast();
                }
            }
        }
    }

    /**
     * 判断当前是不是回文串
     *
     * @return
     */
    private boolean judge(String s, int start, int end) {
        for (int i = start, j = end; i < j; i++, j--) {
            if (s.charAt(i) != s.charAt(j)) {
                return false;
            }
        }
        return true;
    }
}
